/// \file		ITCPClient.h
/// \brief		通信(TCP)客户端类的声明文件
/// \author		xuefeng
/// \version	1.0
/// \date		2011-07-19
/// \history	2011-07-19 新建

#pragma once
#include <string>

#ifndef _WINDCCOM_ENUM_DEF_
#define _WINDCCOM_ENUM_DEF_

/// \brief 连接状态枚举
enum ENU_CONNECT_STATUS
{
	E_CONNECT_SUCCESS,
	E_CONNECT_ADDRERROR,
	E_CONNECT_IOERROR,
	E_CONNECT_TIMEOUT,
};

/// \brief 断开连接状态枚举
enum ENU_DISCONNECT_STATUS
{
	E_DISCONNECT_USERASK,
	E_DISCONNECT_IOERROR,
	E_DISCONNECT_RCVTIMEOUT,
};

#endif //_WINDCCOM_ENUM_DEF_

/// \brief 通信(TCP)客户端通报类
class ITCPClientNotify
{
public:
	/*
		注意：由于线程时序的原因，有可能出现OnRecvServerData，先于OnConnectServer被调用的情况，
		如有同步需求，请在回调函数内自行处理。
	*/
	/// \brief 连接服务器回调函数，由nStatus指定连接是否成功。
	virtual void OnConnectServer(int nStatus) {}

	/// \brief 从服务器接收到数据回调(回调函数应复制数据后，立即返回，否则影响接收效率，MDF方式阻塞时间不得超过15s，否则断线)
	/// \param pbData 数据指针(函数调用后即释放，勿超范围使用，勿在函数中删除)
	/// \param unDataSize 数据大小
	virtual void OnRecvServerData(const unsigned char* pbData, unsigned int unDataSize) {}

	/// \brief 从服务器接收数据异常回调
	virtual void OnServerDataError() {}

	/// \brief Socket连接断开回调
	virtual void OnServerDisconnect(int nStatus) {}

	// 内部消息通知
	///< 调试信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_DEBUG = 0;
	/////< 普通信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_INFO = 1;
	/////< 警告信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_WARN = 2;
	/////< 错误信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_ERROR = 3;
	virtual void OnTCPMsg(int type, std::string msg) {}
};

/// \brief 通信(TCP)客户端类
class ITCPClient
{
public:
  ///注册回调接口
  virtual void RegisterSpi(ITCPClientNotify *pSpi) = 0;

	/// \brief 连接MDF协议的TCP服务器
	/// \param szIP 服务器IP
	/// \param usPort 服务器端口
	/// \param blAuth 是否验证(暂不支持)
	/// \param unTimeOut 超时时间(单位秒)
	virtual void ConnectServer(const char *szIP, unsigned short usPort, bool blAuth = false, unsigned int unTimeOut = 0) = 0;

	/// \brief 发送数据给MDF协议的服务器(与ConnectMDFServer配对使用)
	/// \param pbData 数据指针
	/// \param unDataSize 数据大小
	/// \return 是否发送成功
	virtual bool SendDataToServer(const unsigned char *pbData, unsigned int unDataSize) = 0;

	/// \brief 连接非MDF协议的TCP服务器(兼容现有的服务器而设计)
	/// \param szIP 服务器IP
	/// \param usPort 服务器端口
	/// \param blAuth 是否验证(暂不支持)
	/// \param unTimeOut 超时时间(单位秒)
	virtual void ConnectOtherServer(const char *szIP, unsigned short usPort, bool blAuth = false, unsigned int unTimeOut = 0) = 0;

	/// \brief 发送数据给非MDF协议的服务器(与ConnectOtherServer配对使用，兼容现有的服务器而设计)
	/// \param pbData 数据指针
	/// \param unDataSize 数据大小
	/// \return 是否发送成功
	virtual bool SendDataToOtherServer(const unsigned char *pbData, unsigned int unDataSize) = 0;

	/// \brief 与服务器断开网络连接
	virtual void CloseSocket() = 0;
};

extern "C"
{
	/// \brief 创建客户端对象
	/// \param poNotifyObj 通报对象指针
	/// \param HBInterval 心跳间隔，单位毫秒(ms)
	/// \param usThreadCount 内部IOServices线程数目（0代表使用默认数值，2*cpu+1）
	/// \return 客户端对象指针
	ITCPClient* CreateTCPClientInstance(ITCPClientNotify* poNotifyObj, int HBInterval = 15000, unsigned short usThreadCount = 0);

	/// \brief 释放客户端对象
	/// \param poClientInstance 客户端对象指针
	void ReleaseTCPClientInstance(ITCPClient* poClientInstance);
}
